package main

import (
	"bigdevops/src/alert-webhook/cron"
	"bigdevops/src/common"
	"bigdevops/src/config"
	"bigdevops/src/models"
	"bigdevops/src/web"
	"context"
	"flag"
	"fmt"
	esl "github.com/ning1875/errgroup-signal/signal"
	"github.com/prometheus/alertmanager/template"
	"go.uber.org/zap"
)

func main() {

	// 主配置文件 命令行参数
	var (
		configFile string
	)

	flag.StringVar(&configFile, "config_file", "./alert_webhook.yml", "The config yml")

	flag.Parse()

	sc, err := config.LoadAlertWebhook(configFile)
	if err != nil {
		fmt.Printf("解析主配置文件错误:%v\n", err)
		return
	}

	logger := common.NewZapLogger(sc.LogLevel, sc.LogFilePath)
	defer logger.Sync() // flushes buffer, if any
	sc.Logger = logger
	logger.Info("解析主配置文件成功 logger初始化成功")
	err = models.InitDb(sc.MysqlC.DSN)
	if err != nil {
		logger.Error("初始化gorm-db错误",

			zap.Error(err),
		)
		return
	}
	logger.Info("初始化gorm-db成功")

	// chan 需要给 gin receive 生产者  和消费者 使用
	alertReceiveQ := make(chan template.Alert, sc.AlertReceiveQueueSize)

	// 判断缓存是否已经同步了
	cacheHasSynced := make(chan struct{})
	// new cache
	ac := cron.NewAlertCache(sc, alertReceiveQ, cacheHasSynced)
	// 初始化这个group
	// stopChan 有值，说明要退出 esl "github.com/ning1875/errgroup-signal/signal"
	group, stopChan := esl.SetupStopSignalContext()
	ctxAll, cancelAll := context.WithCancel(context.Background())
	// 首先添加一个退出信号管理

	group.Go(func() error {
		logger.Info("[stopchan监听启动]")
		for {
			select {
			case <-stopChan:
				logger.Info("捕获退出信号 停止ctx 通知所有任务退出")
				cancelAll()
				return nil
			}

		}
	})

	group.Go(func() error {

		logger.Info("计划任务-缓存刷新-缓存启动")
		err := ac.RenewMapManager(ctxAll)
		if err != nil {
			logger.Error("计划任务-缓存刷新--报错", zap.Error(err))
		}
		return err
	})

	group.Go(func() error {

		logger.Info("计划任务-receive模块-缓存启动")
		err := ac.AlertReceiveConsumerManager(ctxAll)
		if err != nil {
			logger.Error("计划任务-receive模块--报错", zap.Error(err))
		}
		return err
	})

	group.Go(func() error {
		// 如果缓存那边没有close 这个chan ，我的web会一直卡在这里
		<-cacheHasSynced
		errChan := make(chan error, 1)
		go func() {
			errChan <- web.AlertWebhookStartGin(sc, alertReceiveQ)
		}()

		logger.Info("web启动成功")
		select {
		case err := <-errChan:
			logger.Error("gin报错", zap.Error(err))
			return err
		case <-ctxAll.Done():
			logger.Info("gin收到其他任务退出信号 退出")
			return nil
		}
	})

	group.Wait()
}
